package com.yh.controller;

import java.io.File;
import java.util.HashMap;
import java.util.Map;






import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.yh.annotation.SystemControllerLog;
import com.yh.bean.User;
import com.yh.service.UserService;
import com.yh.util.DateUtil;
import com.yh.util.FileUtil;
import com.yh.util.SaldUtil;
import com.yh.util.UserContextUtil;

//使用注解方式依赖注入到容器中
@Controller
@RequestMapping("/user")
public class UserController {
	
	@Autowired //注解方式自动注入
	private UserService userService;

	//1.定义一个控制器层方法，用来查找所有员工信息，通过json 方式传给前台
	@RequestMapping("/queryUserInfo") //前台页面的要找的方法
	@ResponseBody //json 数据格式要依赖的实体Bean
	@SystemControllerLog(description = "查询员工信息操作")
	public Map<String, Object> queryUserInfo(String userName,String realName, int currentPage){
		//1.获取前台数据将其判断并封装到map 集合中
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("userName", userName);
		map.put("realName", realName);
		map.put("currentPage", currentPage);
		
		//2.调用业务实现层方法获取数据
		Map<String, Object> newMap = userService.getUserInfoByIf(map);
		return newMap;
	}
	
	//2.定义一个控制器层方法，用来查找所有部门、角色 信息，通过json 方式传给前台
	@RequestMapping("getMapInfo")
	@ResponseBody
	public Map<String, Object> getMapInfo() {
		//调用业务层方法获取map 集合
		Map<String, Object> map = userService.getDeptAndRole();
		return map;
	}
	
	//3.定义一个方法用来上传user 信息
	@RequestMapping("addUserInfo")
	@ResponseBody
	@Transactional
	@SystemControllerLog(description ="添加用户操作")
	public String addUserInfo(User user,HttpServletRequest request ,
			@RequestParam("photo") MultipartFile photo){
		//1.获取用户上传文件时的照片名字
		System.out.println(user.getUser_name());
		if(photo.getOriginalFilename() !=null && photo.getOriginalFilename() !=""){
			String image =DateUtil.getCurrentDate()+photo.getOriginalFilename();
			System.out.println("------------"+image);
			
			//2.调用文件上传工具类
			if( ! FileUtil.uploadFile(photo, request)){
				
				return "error";
			}

			//3.设置user对象的image
			user.setImage(image);
			//4.调用盐值加密对象对密码进行加密后放入数据库
	        user.setPassword(SaldUtil.getPassWordSald(user.getPassword(), user.getUser_name()));
	        
	        System.out.println(user);
	        //5.调用实现类对象把数据插入到数据库中
	        userService.insertUserInfo(user);
	        
	        return "success";
		}else{
			return "error";
		}	
	}
	

	
	//4.获取当前id对应的用户信息
	@RequestMapping("getMapInfoById")
	@ResponseBody
	@Transactional
	public Map<String, Object> getMapInfoById(int userid){
		//1.通过调用业层方法获取当前id 对应的user 信息以及 以及部门信息和角色信息
		Map<String, Object> newMap=userService.getDeptAndRoleAndUserById(userid);
		
		return newMap;
	}
	
	
	
	
	//5.定义一个方法用来修改user 信息
	@RequestMapping("modifyInfoById")
	@ResponseBody
	@SystemControllerLog(description = "修改员工信息操作")
	public String modifyInfoById(User user,HttpServletRequest request ,
			@RequestParam("photo") MultipartFile photo){
		        
				System.out.println(user);
				  //判断如果photo 不为空就说明用户修改了照片
				if(photo.getOriginalFilename() !=null && photo.getOriginalFilename() !=""){
					String image =DateUtil.getCurrentDate()+photo.getOriginalFilename();
					System.out.println("------------"+image);
					//1>获取之前已有的照片的名字
					String user_image = user.getImage().substring(user.getImage().lastIndexOf("/")+1);
					//2>创建文件对象
					File file = new File(request.getServletContext().getRealPath("/photos"));
					//3>得到文件数组
					File[] files=file.listFiles();
					for (int i = 0; i < files.length; i++) {
						if(files[i].isFile()){
							if(files[i].getName().equals(user_image)){
								files[i].delete();
							}
						}
					}
					//2.调用文件上传工具类
					if( ! FileUtil.uploadFile(photo, request)){
						
						return "error";
					}

					//3.设置user对象的image
					user.setImage(image);
					//4.调用盐值加密对象对密码进行加密后放入数据库
			        user.setPassword(SaldUtil.getPassWordSald(user.getPassword(), user.getUser_name()));
			        
			        System.out.println(user);
			        
			        //5.调用实现类对象更新数据
			        userService.updateUserInfo(user);
			        
			        return "success";
				}else{
					//否则就说明用户没有修改照片只修改了其它内容，然后
					if(user.getImage() != null){
						
						String image = user.getImage().substring(user.getImage().lastIndexOf("/")+1);
						
						user.setImage(image);
						//调用盐值加密对象对密码进行加密后放入数据库
				        user.setPassword(SaldUtil.getPassWordSald(user.getPassword(), user.getUser_name()));
				        System.out.println("/////////"+user);
				        //调用实现类对象更新数据
				        userService.updateUserInfo(user);
				        
				        return "success";
					}else{
						
						return "error";
					}	
				}	
					
				
	}
	
	//7.定义一个方法用来删除用户
		@RequestMapping("deleteUserInfoById")
		@ResponseBody
		@SystemControllerLog(description = "删除员工信息操作")
		public String deleteUserInfoById(int userid){
			//1.调用业务层方法进行删除
			return userService.deleteUserInfoById(userid);
			
		}

	//6.定义一个方法用来登录系统
	@RequestMapping("/login")
	public String login(User user,HttpServletRequest request){
		
		System.out.println("*****======"+user+"======*****");
		//1.获取安全工具对象
		Subject subject = SecurityUtils.getSubject();
		//2.使用shiro 的账号密码令牌对象进行校验匹配
		 //首先按照用户输入的用户名和密码把密码进行加密后放入token 对象中
		String password = SaldUtil.getPassWordSald(user.getPassword(), user.getUser_name());
		UsernamePasswordToken token = new UsernamePasswordToken(user.getUser_name(),password);
		//3.调用subject 的login 方法进行登录验证，会自动委托给shiro 的securityManager 管理器进行管理
		   //调用之前会跳到我们自定义的realm中
		try {
			    subject.login(token);
			    //获取当前的登录用户
			 	User currentUser =UserContextUtil.getUser();
			 	//把当前用户放入到session中
			 	request.getSession().setAttribute("user", currentUser);
			 	System.out.println("*/*/**/*/*/*/*/*/**********************************"+request.getSession().getAttribute("user"));
			return "redirect:/oa/index.jsp";
			
		} catch (Exception e) {
			e.printStackTrace();
			/*
			 //获取当前的登录用户
		 	User currentUser =UserContextUtil.getUser();
		 	//把当前用户放入到session中
		 	request.getSession().setAttribute("user", user);
		 	*/
		 	request.getSession().setAttribute("error", "用户名或密码错误请重新登录");
		 	
		 	return "redirect:/login.jsp";
		} 
	}
	
	//8.定义一个方法用来用户退出登录
	@RequestMapping("/logout")
	 public String logout(RedirectAttributes redirectAttributes,HttpServletRequest request ){   
        //使用权限管理工具进行用户的退出，跳出登录，给出提示信息  
        SecurityUtils.getSubject().logout(); 
        
        request.getSession().invalidate();//失效session中的数据
        request.setAttribute("message", "您已安全退出");
        redirectAttributes.addFlashAttribute("message", "您已安全退出");    
        return "redirect:/login.jsp";  
    }   
	
	//9.定义一个方法用来查询饼图所需要的信息
	@RequestMapping("/queryPieInfo.do")
	@ResponseBody
	public Map<String,Object> queryPieInfo(){
		//1.调用业务层方法查找数据 
		return userService.countUserandDept();
	}
	
	
	
	

}
